a = 100

def func1():
    # 直接使用全局变量，可以
    print("func1:", a)

def func2():
    # 直接修改全局变量，不可以
    # 该代码会创建同名的局部变量
    a = 200
    print("func2:", a)

def func3():
    global a
    a = 300
    print("func3:", a)

'''
外部变量的使用 在普通函数中，虽然可以直接使用全局变量，但是不可以直接修改全局变量。
从变量的作用域来说，一旦你尝试修改全局变量，那么就会尝试创建并使用一个同名的局部变量。
因此，如果你需要在普通函数中修改全局变量，需要使用global
'''

######################################################

#同样的，如果你希望通过定义在内部的函数去修改其外部函数的变量，那么必须使用nonlocal
def func4():
    a = 400
    def func1_inner():
        a = 500
    func1_inner()
    print("func4:", a)  # 此时a仍然为400，不会被修改


def func5():
    a = 600
    def func2_inner():
        nonlocal a
        a = 700
    func2_inner()
    print("func5:", a)  # 此时a已经被修改为了700




if __name__ == "__main__":
    func1()  #100

    # 执行完func2，全局的a的值不会被改变
    func2()  #200
    print(a) #100

    # 执行func3，全局的a的值发生了改变
    func3()  #300
    print(a) #300

    func4() #400
    func5() #700


